package client // Package client import "xemo.top/docker/docker/client"
import (
	"context"
	"net/url"
	"xemo.top/docker/docker/api/types"
)

// ContainerAttach 将连接附加到服务器中的容器。它返回带有被劫持的连接的types.HijackedConnection和a读取器以获取输出。由被调用方通过调用types.HijackedResponse.close来关闭被劫持的连接。
// ContainerAttach attaches a connection to a container in the server.It returns a types.HijackedConnection with the hijacked connection and the reader to get output.It's up to the called to close the hijacked connection by calling types.HijackedResponse.Close.
//
// 响应上的流格式将采用以下两种格式之一:
// The stream format on the response will be in one of two formats:
//
// 如果容器使用TTY，则只有单个流 (stdout)，并且直接从容器输出流复制数据，没有额外的多路复用或标头。
// If the container is using a TTY,there is only a single stream (stdout),and data is copied directly from the container output stream,no extra multiplexing or headers.
//
// If the container is *not* using a TTY,streams for stdout and stderr are multiplexed stream is as follows:
//
// [8]byte{STREAM_TYPE,0,0,0,SIZE1,SIZE2,SIZE3,SIZE4}[]byte{OUTPUT}
//
// STREAM_TYPE can be 1 for stdout and 2 for stderr
//
// SIZE1,SIZE2,SIZE3,and SIZE4 are four bytes of uint32 encoded as big endian. This is the size of OUTPUT
func (cli *Client) ContainerAttach(ctx context.Context, container string, options types.ContainerAttachOptions) (types.HijackedResponse, error) {
	query := url.Values{}
	if options.Stream {
		query.Set("stream", "1")
	}
	if options.Stdin {
		query.Set("stdin", "1")
	}
	if options.Stdout {
		query.Set("stdout", "1")
	}
	if options.Stderr {
		query.Set("stderr", "1")
	}
	if options.DetachKeys != "" {
		query.Set("detachKeys", options.DetachKeys)
	}
	if options.Logs {
		query.Set("logs", "1")
	}
	headers := map[string][]string{"Content-Type": {"text/plain"}}
	return cli.postHijacked(ctx, "/containers/"+container+"/attach", query, nil, headers)
}
